import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Clase que inicializa los objetos y todo lo necesario para cada escenario del juego.
 * @author Héctor Nicolás Anguiano Huerta
 * @version Octubre de 2012.
 */
public class Zombieland extends World
{
    private Menu menu;
    private Menu menu2;
    private Menu menu3;
    private Menu instruc1;
    private Menu instruc2;
    private Menu credito;
    private Menu botonsig;
    private Menu botonatr;
    private Menu botonregmenu;
    private GreenfootImage fondo;
    private GreenfootImage fondo2;
    private GreenfootImage fondo3;
    private GreenfootImage fondo4;
    private Exterminador ex;
    private Time tim;
    private int nivel;
    private Contador vidas; //vidas
    private Contador2 puntos; //puntos
    private int v, p;
    /**
     * Constructor para los objetos de la clase Zombieland.
     */
    public Zombieland()
    {    
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels.
        super(1080, 535, 1); 
        ex = new Exterminador();
        tim = new Time();
        menu = new Menu(0);
        menu2 = new Menu(1);
        menu3 = new Menu(2);
        fondo = new GreenfootImage("Menu.png");
        fondo2 = new GreenfootImage("Nivel1.jpg");
        fondo3 = new GreenfootImage("Nivel2.png");
        fondo4 = new GreenfootImage("Nivel3.png");
        instruc1 = new Menu(3);
        instruc2 = new Menu(4);
        botonsig = new Menu(5);
        botonatr = new Menu(6);
        botonregmenu = new Menu(7);
        credito = new Menu(8);
        cambiaEscenario(4);
    }
    
    /**
     * Metodo que sirve para inicializar el menu.
     */
    public void menuIni()
    {
        remove();
        setBackground(fondo);
        addObject(menu, 250, 426);
        addObject(menu2, 550, 426);
        addObject(menu3, 850, 426);
    }
    
    /**
     * Añade los objetos necesarios para que se muestren las instrucciones.
     * @param aux Recibe un parametro llamado aux para indicar que imagen de las instrucciones se mostrará.
     */
    public void instrucciones(int aux)
    {
        if(aux==0)
        {
            remove();
            addObject(instruc1,539,268);
            addObject(botonsig,962,495);
            addObject(botonregmenu,962,40);
        }
        if(aux==1)
        {
            remove();
            addObject(instruc2,539,268);
            addObject(botonatr,962,495);
            addObject(botonregmenu,962,40);
        }
    }
    
    /**
     * Añade los objetos necesarios para que se muestren los creditos del juego.
     */
    public void ponCreditos()
    {
        remove();
        addObject(credito,540,268);
        addObject(botonregmenu,962,490);
    }
    
    /**
     * Esta clase se encarga de limpiar y poner los objetos del mundo segun el escenario que el usuario ha elegido.
     * @param e Es un entero que es usado dentro del switch para elegir el escenario.
     */
    public void cambiaEscenario(int e)
    {
        
        switch(e)
        {
            case 0: remove();
                    prepare1();
                    break;
            case 1: remove();
                    prepare2();
                    break;
            case 2: remove();
                    prepare3();
                    break;
            case 3: remove();
                    cambiaEscenario(nivel);
                    break;
            case 4: nivel=0;
                    remove();
                    menuIni();
                    break;
        }
    }
    
    /**
     * Remueve todos los objetos que se encuentren en el escenario.
     */
    public void remove()
    {
        int aux;
        aux=getObjects(null).size();
        Actor a;
        for(int f=0;f<aux;f++)
        {
            a = (Actor) getObjects(null).get(0);
            removeObject(a);  
        }
    }
   
    /**
     * Metodo que hace que aumenten sus vidas.
     */
    public void sumaVida()
    {
        ex.aumentaVida();
        v = ex.regresaVidas();
        vidas.actualizaCont(String.valueOf(v));
    }
    
    /**
     * Metodo que hace que disminuyan sus vidas.
     */
    public void restaVida()
    {
        ex.disminuyeVida();
        v = ex.regresaVidas();
        vidas.actualizaCont(String.valueOf(v));
    }
    
    /**
     * Metodo que hace que aumenten sus puntos
     */
    public void sumaPunto()
    {
        ex.aumentaPunto();
        p = ex.regresaPuntos();
        puntos.actualizaCont(String.valueOf(p));
    }
    
    /**
     * Metodo que hace que disminuyan sus puntos.
     */
    public void restaPunto()
    {
        ex.disminuyePunto();
        p = ex.regresaPuntos();
        puntos.actualizaCont(String.valueOf(p));
    }
    
    /**
     * Sirve para llamar al metodo prepare2 ya que es privado.
     */
    public void nivel2()
    {
        prepare2();
    }
    
    /**
     * Sirve para llamar al metodo prepare3 ya que es privado.
     */
    public void nivel3()
    {
        prepare3();
    }
    
    /**
      * Añade los objetos necesarios para el nivel 1.
      */
    private void prepare1()
    {
        Greenfoot.playSound("04 Aggressive Expansion.mp3");
        setBackground(fondo2);
        v=ex.regresaVidas();
        p=ex.regresaPuntos();
        Exterminador ex = new Exterminador();
        addObject(ex, 585, 460);
        tim = new Time();
        addObject(tim, 60, 520);
        vidas = new Contador(String.valueOf(v));
        addObject(vidas, 220,520);
        puntos = new Contador2(String.valueOf(p));
        addObject(puntos, 380, 520);
        ZombieJackson zj = new ZombieJackson();
        addObject(zj, 1060, 330);
        ZombieNerd nd =  new ZombieNerd();
        addObject(nd, 30, 330);
        ZombieJackson zj1= new ZombieJackson();
        addObject(zj1, 1000,350);
        ZombieNerd nd1 =  new ZombieNerd();
        addObject(nd1, 90, 350);
        ZombieJackson zj2= new ZombieJackson();
        addObject(zj2, 940,330);
        ZombieNerd nd2 =  new ZombieNerd();
        addObject(nd2, 150, 330);
        ZombieJackson zj3= new ZombieJackson();
        addObject(zj3, 880,350);
        ZombieNerd nd3 =  new ZombieNerd();
        addObject(nd3, 210, 350);
        ZombieJackson zj4= new ZombieJackson();
        addObject(zj4, 820,330);
        ZombieNerd nd4 =  new ZombieNerd();
        addObject(nd4, 270, 330);
        Corazon cor = new Corazon();
        addObject(cor,900,340);
        Moneda mon = new Moneda();
        addObject(mon,100,340);
        Meta meta= new Meta();
        addObject(meta,1050,400);
    }
    
    /**
     * Añade los objetos necesarios para el nivel 2.
     */
    private void prepare2()
    {
        setBackground(fondo3);
        ex.actualizaVidas(v);
        ex.actualizaPuntos(p);
        tim = new Time();
        addObject(tim, 60, 520);
        vidas = new Contador(String.valueOf(v));
        addObject(vidas, 220,520);
        puntos = new Contador2(String.valueOf(p));
        addObject(puntos, 380, 520);
        Exterminador ex = new Exterminador();
        addObject(ex, 85, 460);
        ZombieJackson zj = new ZombieJackson();
        addObject(zj, 1060, 330);
        ZombieNerd nd =  new ZombieNerd();
        addObject(nd, 30, 330);
        ZombieJackson zj1= new ZombieJackson();
        addObject(zj1, 1000,350);
        ZombieNerd nd1 =  new ZombieNerd();
        addObject(nd1, 90, 350);
        ZombieJackson zj2= new ZombieJackson();
        addObject(zj2, 940,330);
        ZombieNerd nd2 =  new ZombieNerd();
        addObject(nd2, 150, 330);
        ZombieJackson zj3= new ZombieJackson();
        addObject(zj3, 880,350);
        ZombieNerd nd3 =  new ZombieNerd();
        addObject(nd3, 210, 350);
        ZombieJackson zj4= new ZombieJackson();
        addObject(zj4, 820,330);
        ZombieNerd nd4 =  new ZombieNerd();
        addObject(nd4, 270, 330);
        ZombieMusic zm = new ZombieMusic();
        addObject(zm, 1000, 370);
        Zombienator zn = new Zombienator();
        addObject(zn, 20, 370);
        ZombieMusic zm2 = new ZombieMusic();
        addObject(zm2, 1050, 370);
        Zombienator zn2 = new Zombienator();
        addObject(zn2, 50, 370);
        Corazon cor = new Corazon();
        addObject(cor,900,340);
        Moneda mon = new Moneda();
        addObject(mon,100,340);
        Corazon cor2 = new Corazon();
        addObject(cor2,700,340);
        Moneda mon2 = new Moneda();
        addObject(mon2,200,340);
        Meta2 meta2= new Meta2();
        addObject(meta2,1050,400);
    }
    
    /**
     * Añade los objetos necesarios para el nivel 3.
     */
    private void prepare3()
    {
        setBackground(fondo4);
        ex.actualizaVidas(v);
        ex.actualizaPuntos(p);
        tim = new Time();
        addObject(tim, 60, 520);
        vidas = new Contador(String.valueOf(v));
        addObject(vidas, 220,520);
        puntos = new Contador2(String.valueOf(p));
        addObject(puntos, 380, 520);
        Exterminador ex = new Exterminador();
        addObject(ex, 85, 460);
        ZombieJackson zj = new ZombieJackson();
        addObject(zj, 1060, 330);
        ZombieNerd nd =  new ZombieNerd();
        addObject(nd, 30, 330);
        ZombieJackson zj1= new ZombieJackson();
        addObject(zj1, 1000,350);
        ZombieNerd nd1 =  new ZombieNerd();
        addObject(nd1, 90, 350);
        ZombieJackson zj2= new ZombieJackson();
        addObject(zj2, 940,330);
        ZombieNerd nd2 =  new ZombieNerd();
        addObject(nd2, 150, 330);
        ZombieJackson zj3= new ZombieJackson();
        addObject(zj3, 880,350);
        ZombieNerd nd3 =  new ZombieNerd();
        addObject(nd3, 210, 350);
        ZombieJackson zj4= new ZombieJackson();
        addObject(zj4, 820,330);
        ZombieNerd nd4 =  new ZombieNerd();
        addObject(nd4, 270, 330);
        ZombieMusic zm = new ZombieMusic();
        addObject(zm, 1000, 370);
        Zombienator zn = new Zombienator();
        addObject(zn, 20, 370);
        ZombieMusic zm2 = new ZombieMusic();
        addObject(zm2, 1050, 370);
        Zombienator zn2 = new Zombienator();
        addObject(zn2, 50, 370);
        ZombieThor zt = new ZombieThor();
        addObject(zt,1010,320);
        ZombieThor zt2 = new ZombieThor();
        addObject(zt2,1050,350);
        ZombieVader zv = new ZombieVader();
        addObject(zv,900,325);
        Corazon cor = new Corazon();
        addObject(cor,900,340);
        Moneda mon = new Moneda();
        addObject(mon,100,340);
        Corazon cor2 = new Corazon();
        addObject(cor2,700,340);
        Moneda mon2 = new Moneda();
        addObject(mon2,200,340);
        Corazon cor3 = new Corazon();
        addObject(cor3,500,340);
        Moneda mon3 = new Moneda();
        addObject(mon3,300,340);
        Meta3 meta3= new Meta3();
        addObject(meta3,1050,400);
    }
}